
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>为什么需要锁？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>为什么需要锁？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">在并发环境中，“数据竞争”指的是什么？锁是如何解决这个问题的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">数据竞争是指在多线程或多进程环境中，多个线程或进程同时访问和修改共享数据，可能导致数据不一致或错误。锁通过保证同一时刻只有一个线程可以访问共享资源，来避免数据竞争，从而确保数据的一致性和完整性。</div>
          </div>
          <div class="card-source">来源: 1. 避免数据竞争</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">锁机制如何确保并发操作的“原子性”？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">原子性操作指操作要么完全执行，要么完全不执行。锁能够确保一段代码在执行时不会被其他线程打断。这样，在一个线程完成对共享资源的修改之前，其他线程无法读取或修改该资源，从而实现了操作的原子性。</div>
          </div>
          <div class="card-source">来源: 2. 保证操作的原子性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">什么是“脏读”现象，锁在防止脏读中起到了什么作用？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">脏读是指一个线程读取到另一个线程尚未提交的中间结果，从而可能得到不一致的数据。锁机制可以确保在一个线程完成对共享资源的操作后，其他线程才能读取到最终结果，从而有效防止脏读的发生。</div>
          </div>
          <div class="card-source">来源: 3. 防止脏读</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">文档中提到的“死锁”和“资源饥饿”是什么？应如何通过使用锁来缓解这些问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">死锁是指两个或多个线程互相等待对方释放资源而陷入无限等待的状态。资源饥饿是指某些线程永远无法获得所需资源而无法执行。通过合理使用锁，例如避免嵌套锁、使用定时锁等策略，可以有效地解决或减少这类问题的发生。</div>
          </div>
          <div class="card-source">来源: 4. 避免死锁和资源饥饿</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">除了提供互斥访问外，像“条件变量（Condition）”这样的锁机制还能实现什么高级功能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">除了互斥功能，像条件变量这类特殊的锁机制还可以用于实现线程间的通信和协调。它们允许线程在特定条件下进行等待和唤醒，从而协调彼此的执行。</div>
          </div>
          <div class="card-source">来源: 5. 实现线程间通信</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">应用</div>
          <div class="card-question">在数据库系统中，锁是如何被用来保证“事务的一致性”的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">应用</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在数据库系统中，锁机制被用于管理事务，它能确保在一个事务完成之前，其他事务无法修改相关数据。这种隔离机制保证了事务的操作要么全部完成，要么全部失败，从而保持了事务的一致性。</div>
          </div>
          <div class="card-source">来源: 7. 确保事务的一致性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">作为一种同步控制工具，锁在并发程序中扮演的核心角色是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">锁是一种同步控制工具，其核心角色是控制对共享资源的访问。它通过将共享资源的访问权限在同一时间限制在一个线程内，来避免因并发访问可能引发的冲突和数据不一致性。</div>
          </div>
          <div class="card-source">来源: 6. 实现同步控制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">为什么说使用锁能够提高多线程程序行为的“可预测性”？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">因为多线程程序的行为往往因线程执行的顺序和时间不确定而难以预测。通过使用锁，可以控制线程对共享资源的访问顺序，从而使得程序行为更加符合预期，提高了可预测性。</div>
          </div>
          <div class="card-source">来源: 8. 提高程序的可预测性</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">锁在计算机科学中，其最根本的用途是解决什么问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">锁在计算机科学中，最根本的用途是解决并发环境下的资源共享问题。它作为一种同步机制，用于协调对共享资源的访问，以确保系统的正确性和稳定性。</div>
          </div>
          <div class="card-source">来源: 文档开篇段落</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
